package com.example.demo1;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

public class Test {
    public static void main(String[] args) throws Exception {
        // 1.创建一个Dom4j框架提供的解析器对象
        SAXReader saxReader = new SAXReader();

        // 2.使用saxReader对象把需要解析的XML文件读成一个Document对象
        // 此时document对象就代表整个XML文件
        // Document document = saxReader.read("day25-final-test\\src\\orders.xml");
        // 表示使用类加载器读取位于类路径下的 orders.xml 文件
        Document document = saxReader.read(Test.class.getResourceAsStream("/orders.xml"));

        // 3.从文档对象中解析XML文件的全部数据
        Element root = document.getRootElement(); // 获取根元素对象
        System.out.println(root.getName());

        List<Order> orders = new ArrayList<>();
        // 4.获取根元素下 的全部一级子元素
        List<Element> elements = root.elements("order");
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

        // 遍历元素集合,为每个元素创建Order对象,并设置其属性
        for (Element element : elements) {
            // 创建一个新的Order对象
            Order order = new Order();
            // 获取当前元素的"id"属性值,并设置到Order对象中
            String id = element.attributeValue("id");
            order.setId(Integer.valueOf(id));
            // 获取当前元素下的"name"子元素文本值,并设置到Order对象中
            String name = element.elementText("name");
            order.setName(name);
            // 获取当前元素下的"time"子元素文本值,并解析为LocalDateTime类型,设置到Order对象中
            String time = element.elementText("time");
            order.setLocalDateTime(LocalDateTime.parse(time, dtf));
            // 获取当前元素下的"price"子元素文本值,并解析为Double类型,设置到Order对象中
            String price = element.elementText("double");
            order.setPrice(Double.parseDouble(price));
            // 将设置好属性的Order对象添加到订单集合中
            orders.add(order);
        }

        // 请使用Stream流找出今天之前的订单,并遍历输出
        System.out.println("今天之前的订单:");
        orders.stream().filter(o -> o.getLocalDateTime().isBefore(LocalDateTime.now())).forEach(System.out::println);

        // 请使用Stream流找出集合中价格最贵的订流单,把这个订单的详细信息打印出来
        System.out.println("价格最贵的订流单:");
        // orders.stream().max((o1, o2) -> Double.compare(o1.getPrice(), o2.getPrice())).ifPresent(System.out::println);
        // 这是上面的简化写法
        orders.stream().max(Comparator.comparingDouble(Order::getPrice)).ifPresent(System.out::println);

        // 请使用Stream流遍历集合中的每个订单,要求按照价格降序输出每个订单的详情
        System.out.println("按照价格降序输出每个订单的详情:");
        orders.stream().sorted(((o1, o2) -> Double.compare(o2.getPrice(), o1.getPrice()))).forEach(System.out::println);
    }
}
